{"componentChunkName":"component---node-modules-rocketseat-gatsby-theme-docs-core-src-templates-docs-query-js","path":"/manual-review/UniformlyProvidedVestingFacetStorage-UPF","result":{"data":{"mdx":{"id":"3a3e9947-6952-511f-9351-94761f9a1ca5","excerpt":"UPF-01M: Potential Cascading Rounding Errors Type Severity Location Mathematical Operations UniformlyProvidedVestingFacetStorage.sol:L127-L130 ,  L132 ,  L134-L…","fields":{"slug":"/manual-review/UniformlyProvidedVestingFacetStorage-UPF/"},"frontmatter":{"title":"UniformlyProvidedVestingFacetStorage Manual Review Findings","description":"Contains all the findings that relate to manual review on the contract codebase","image":null,"disableTableOfContents":null},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"UniformlyProvidedVestingFacetStorage Manual Review Findings\",\n  \"description\": \"Contains all the findings that relate to manual review on the contract codebase\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", {\n    \"id\": \"span-idupf-01mupf-01m-potential-cascading-rounding-errorsspan\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#span-idupf-01mupf-01m-potential-cascading-rounding-errorsspan\",\n    \"aria-label\": \"span idupf 01mupf 01m potential cascading rounding errorsspan permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), mdx(\"span\", {\n    id: \"UPF-01M\"\n  }, \"UPF-01M: Potential Cascading Rounding Errors\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Severity\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Location\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/reports/evergon-labs-tokenizer-6763f6df7b5d3d00195ae534/appendix/finding-types#mathematical-operations\"\n  }, \"Mathematical Operations\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"img\", {\n    parentName: \"td\",\n    \"className\": \"o-severity o-minor\",\n    \"src\": \"https://omniscia.io/report-assets/minor.png\"\n  })), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/TMI-tokenizer/blob/3bf02f23825484f7fabe1671684226bc2ed2aea9/packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol#L127-L130\"\n  }, \"UniformlyProvidedVestingFacetStorage.sol:L127-L130\"), \", \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/TMI-tokenizer/blob/3bf02f23825484f7fabe1671684226bc2ed2aea9/packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol#L132\"\n  }, \"L132\"), \", \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/TMI-tokenizer/blob/3bf02f23825484f7fabe1671684226bc2ed2aea9/packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol#L134-L140\"\n  }, \"L134-L140\"))))), mdx(\"h3\", {\n    \"id\": \"description\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#description\",\n    \"aria-label\": \"description permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Description:\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/evergonlabs/TMI-tokenizer/blob/3bf02f23825484f7fabe1671684226bc2ed2aea9/packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol#L79-L142\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"UniformlyProvidedVestingFacetStorage::doVestingActions\")), \" function integrates with the Evergon Labs ODC system to permit a linear vesting system that makes use of an \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://eips.ethereum.org/EIPS/eip-1155\"\n  }, \"EIP-1155\"), \" fractionalized asset to utilize ID subsets as the vesting period that was last claimed.\"), mdx(\"p\", null, \"The integration utilizes a percentage-based unlock ratio that would inevitably result in truncation errors, ultimately resulting in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FractionERC1155DataManager\"), \" to retain funds in its \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"wrapper\"), \" incorrectly.\"), mdx(\"h3\", {\n    \"id\": \"impact\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#impact\",\n    \"aria-label\": \"impact permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Impact:\"), mdx(\"p\", null, \"The user will continuously forfeit a small percentage of funds they are owed on each partial redemption which they cannot presently control.\"), mdx(\"h3\", {\n    \"id\": \"example\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#example\",\n    \"aria-label\": \"example permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-sol\",\n    \"metastring\": \"title=packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol highlight={7,8,12,19} lineNumbers=true lineOffset=120\",\n    \"title\": \"packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol\",\n    \"highlight\": \"{7,8,12,19}\",\n    \"lineNumbers\": \"true\",\n    \"lineOffset\": \"120\"\n  }, \"uint256 periodAfterCliff;\\nunchecked {\\n    periodAfterCliff = block.timestamp - projectVestingDetails_.cliffTimestamp;\\n}\\nuint256 amountOfPortionPeriodsPassed = periodAfterCliff / projectVestingDetails_.portionPeriod;\\nuint256 portionsToBePaid = amountOfPortionPeriodsPassed - idToBurn;\\nuint256 proportionOfFractions = (amountOfFractions * 1 ether * 1 ether) /\\n    projectVestingDetails_.totalFractionsProportionRemaining;\\nprojectVestingDetails_.totalFractionsProportionRemaining -= ((amountOfFractions * portionsToBePaid * 1 ether) /\\n    projectVestingDetails_.amountOfPortions);\\n\\nuint256 percentageToProvide = (proportionOfFractions * portionsToBePaid) / projectVestingDetails_.amountOfPortions;\\n\\nISemiFungibleFraction(GeneralStorage.layout().infoForId[campaignId].fractionsContract).burnMintAndPartiallyUnwrap(\\n    amountOfFractions,\\n    idToBurn,\\n    amountOfPortionPeriodsPassed,\\n    account,\\n    percentageToProvide\\n);\\n\")), mdx(\"h3\", {\n    \"id\": \"recommendation\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#recommendation\",\n    \"aria-label\": \"recommendation permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Recommendation:\"), mdx(\"p\", null, \"We advise a mechanism to account for rounding errors to be introduced, potentially by permitting the caller to specify a margin of error they are willing to accept.\"), mdx(\"h3\", {\n    \"id\": \"alleviation-71cda4ccfdcfa25fb96a4565f1f8143b350dd246\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#alleviation-71cda4ccfdcfa25fb96a4565f1f8143b350dd246\",\n    \"aria-label\": \"alleviation 71cda4ccfdcfa25fb96a4565f1f8143b350dd246 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Alleviation (71cda4ccfdcfa25fb96a4565f1f8143b350dd246):\"), mdx(\"p\", null, \"The overall system was revised to mandate wholly divisible fraction amounts and thus to prevent any truncation errors from manifesting, alleviating this exhibit.\"), mdx(ViewDiffButton, {\n    repoUrl: \"https://github.com/evergonlabs/TMI-tokenizer\",\n    mainHash: \"3bf02f23825484f7fabe1671684226bc2ed2aea9\",\n    fixHash: \"71cda4ccfdcfa25fb96a4565f1f8143b350dd246\",\n    gitHubIssue: \"134\",\n    mdxType: \"ViewDiffButton\"\n  }), mdx(\"h2\", {\n    \"id\": \"span-idupf-02mupf-02m-incompatible-fraction-eip-1155-odc-integrationspan\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#span-idupf-02mupf-02m-incompatible-fraction-eip-1155-odc-integrationspan\",\n    \"aria-label\": \"span idupf 02mupf 02m incompatible fraction eip 1155 odc integrationspan permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), mdx(\"span\", {\n    id: \"UPF-02M\"\n  }, \"UPF-02M: Incompatible Fraction EIP-1155 ODC Integration\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Severity\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Location\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/reports/evergon-labs-tokenizer-6763f6df7b5d3d00195ae534/appendix/finding-types#logical-fault\"\n  }, \"Logical Fault\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"img\", {\n    parentName: \"td\",\n    \"className\": \"o-severity o-major\",\n    \"src\": \"https://omniscia.io/report-assets/major.png\"\n  })), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/TMI-tokenizer/blob/3bf02f23825484f7fabe1671684226bc2ed2aea9/packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol#L134-L140\"\n  }, \"UniformlyProvidedVestingFacetStorage.sol:L134-L140\"))))), mdx(\"h3\", {\n    \"id\": \"description-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#description-1\",\n    \"aria-label\": \"description 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Description:\"), mdx(\"p\", null, \"The referenced function integrates with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FractionERC1155DataManager\"), \" to facilitate early redemptions during the vesting schedule, minting a new token ID to represent the fractions that are still owed funds.\"), mdx(\"p\", null, \"This approach is presently an incorrect integration of the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FractionERC1155DataManager\"), \" as the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FractionERC1155DataManager::fullyUnlockWrappedAssets\"), \" function permits the caller to burn \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"the total supply of the \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"0\"), \" token ID\"), \" to acquire all funds within the system and the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FractionERC1155DataManager::partiallyUnlockWrappedAssets\"), \" function behaves in a similar manner.\"), mdx(\"p\", null, \"As such, any users that have balances in a non-zero \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://eips.ethereum.org/EIPS/eip-1155\"\n  }, \"EIP-1155\"), \" ID might have their funds stolen via the two aforementioned functions.\"), mdx(\"h3\", {\n    \"id\": \"impact-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#impact-1\",\n    \"aria-label\": \"impact 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Impact:\"), mdx(\"p\", null, \"Any user that has partially vested their entries and has acquired fractions in a non-zero token ID may have the assets they are owed stolen via direct interaction with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"fractionsContract\"), \".\"), mdx(\"h3\", {\n    \"id\": \"example-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#example-1\",\n    \"aria-label\": \"example 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-sol\",\n    \"metastring\": \"title=packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol highlight={56,57,58,59,60,61,62} lineNumbers=true lineOffset=78\",\n    \"title\": \"packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol\",\n    \"highlight\": \"{56,57,58,59,60,61,62}\",\n    \"lineNumbers\": \"true\",\n    \"lineOffset\": \"78\"\n  }, \"function doVestingActions(\\n    Layout storage l,\\n    uint256 campaignId,\\n    uint256 idToBurn,\\n    address account,\\n    uint256 amountOfFractions\\n) internal {\\n    ProjectVestingDetails storage projectVestingDetails_ = l.projectVestingDetails[campaignId];\\n\\n    if (projectVestingDetails_.totalFractionsProportionRemaining == 0) {\\n        uint256 totalFractionsPurchased = FungibleAndSemiFungiblePurchaseStorage\\n            .layout()\\n            .infoForId[campaignId]\\n            .totalFractionsPurchased;\\n        if (totalFractionsPurchased == 0) {\\n            revert NonCalculatableVestingProportion();\\n        } else {\\n            projectVestingDetails_.totalFractionsProportionRemaining = totalFractionsPurchased * 1 ether;\\n        }\\n    }\\n\\n    if (block.timestamp <= projectVestingDetails_.cliffTimestamp) revert NonReachedCliff();\\n\\n    // Vesting has ended we just burn and calculate amount (no mint)\\n    if (projectVestingDetails_.vestingEndingTimestamp <= block.timestamp) {\\n        uint256 totalAmountOfPortions = projectVestingDetails_.amountOfPortions;\\n        uint256 portionsToBePaid = totalAmountOfPortions - idToBurn;\\n        uint256 proportionOfFractions = (amountOfFractions * 1 ether * 1 ether) /\\n            projectVestingDetails_.totalFractionsProportionRemaining;\\n        projectVestingDetails_.totalFractionsProportionRemaining -= ((amountOfFractions * portionsToBePaid * 1 ether) /\\n            totalAmountOfPortions);\\n\\n        uint256 percentageToProvide = (proportionOfFractions * portionsToBePaid) / totalAmountOfPortions;\\n\\n        ISemiFungibleFraction(GeneralStorage.layout().infoForId[campaignId].fractionsContract).burnMintAndPartiallyUnwrap(\\n            amountOfFractions,\\n            idToBurn,\\n            0,\\n            account,\\n            percentageToProvide\\n        );\\n    } else {\\n        uint256 periodAfterCliff;\\n        unchecked {\\n            periodAfterCliff = block.timestamp - projectVestingDetails_.cliffTimestamp;\\n        }\\n        uint256 amountOfPortionPeriodsPassed = periodAfterCliff / projectVestingDetails_.portionPeriod;\\n        uint256 portionsToBePaid = amountOfPortionPeriodsPassed - idToBurn;\\n        uint256 proportionOfFractions = (amountOfFractions * 1 ether * 1 ether) /\\n            projectVestingDetails_.totalFractionsProportionRemaining;\\n        projectVestingDetails_.totalFractionsProportionRemaining -= ((amountOfFractions * portionsToBePaid * 1 ether) /\\n            projectVestingDetails_.amountOfPortions);\\n\\n        uint256 percentageToProvide = (proportionOfFractions * portionsToBePaid) / projectVestingDetails_.amountOfPortions;\\n\\n        ISemiFungibleFraction(GeneralStorage.layout().infoForId[campaignId].fractionsContract).burnMintAndPartiallyUnwrap(\\n            amountOfFractions,\\n            idToBurn,\\n            amountOfPortionPeriodsPassed,\\n            account,\\n            percentageToProvide\\n        );\\n    }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"recommendation-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#recommendation-1\",\n    \"aria-label\": \"recommendation 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Recommendation:\"), mdx(\"p\", null, \"We advise the system's integration to be revised, potentially by updating either the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FractionERC1155DataManager\"), \" itself in the ODC repository or by updating the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/evergonlabs/TMI-tokenizer/blob/3bf02f23825484f7fabe1671684226bc2ed2aea9/packages/contracts/contracts/subInternalFacets/vestingPhaseFacets/doVestingActionFacets/uniformlyProvidedVesting/UniformlyProvidedVestingFacetStorage.sol#L79-L142\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"UniformlyProvidedVestingFacetStorage::doVestingActions\")), \" approach.\"), mdx(\"h3\", {\n    \"id\": \"alleviation-71cda4ccfdcfa25fb96a4565f1f8143b350dd246-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#alleviation-71cda4ccfdcfa25fb96a4565f1f8143b350dd246-1\",\n    \"aria-label\": \"alleviation 71cda4ccfdcfa25fb96a4565f1f8143b350dd246 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Alleviation (71cda4ccfdcfa25fb96a4565f1f8143b350dd246):\"), mdx(\"p\", null, \"The Evergon Labs team evaluated this exhibit and proceeded to update the ODC implementations to permit the deployment of an \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://eips.ethereum.org/EIPS/eip-1155\"\n  }, \"EIP-1155\"), \" fraction to define whether user unlocks are enabled.\"), mdx(\"p\", null, \"This mechanism permits user unlocks to be disabled and thus the vulnerability described to not be exploitable as the user would not be able to interact with the ODC implementation directly to withdraw funds.\"), mdx(ViewDiffButton, {\n    repoUrl: \"https://github.com/evergonlabs/TMI-tokenizer\",\n    mainHash: \"3bf02f23825484f7fabe1671684226bc2ed2aea9\",\n    fixHash: \"71cda4ccfdcfa25fb96a4565f1f8143b350dd246\",\n    gitHubIssue: \"133\",\n    mdxType: \"ViewDiffButton\"\n  }));\n}\n;\nMDXContent.isMDXComponent = true;","headings":[{"depth":2,"value":"<span id=\"UPF-01M\">UPF-01M: Potential Cascading Rounding Errors</span>"},{"depth":3,"value":"Description:"},{"depth":3,"value":"Impact:"},{"depth":3,"value":"Example:"},{"depth":3,"value":"Recommendation:"},{"depth":3,"value":"Alleviation (71cda4ccfdcfa25fb96a4565f1f8143b350dd246):"},{"depth":2,"value":"<span id=\"UPF-02M\">UPF-02M: Incompatible Fraction EIP-1155 ODC Integration</span>"},{"depth":3,"value":"Description:"},{"depth":3,"value":"Impact:"},{"depth":3,"value":"Example:"},{"depth":3,"value":"Recommendation:"},{"depth":3,"value":"Alleviation (71cda4ccfdcfa25fb96a4565f1f8143b350dd246):"}]}},"pageContext":{"slug":"/manual-review/UniformlyProvidedVestingFacetStorage-UPF/","prev":{"label":"UniformlyProvidedVestingFacet.sol (UPV-M)","link":"/manual-review/UniformlyProvidedVestingFacet-UPV"},"next":{"label":"AccessControlFacetStorage.sol (ACS-C)","link":"/code-style/AccessControlFacetStorage-ACS"}}},"staticQueryHashes":["1954253342","2328931024","2501019404","973074209"]}